package com.itheima.utils;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {
	/**
	 * 使用md5的算法进行加密
	 */
	public static String md5(String plainText) {
		byte[] secretBytes = null;
		try {
			//此 MessageDigest 类为应用程序提供信息摘要算法的功能，如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数，它接收任意大小的数据，并输出固定长度的哈希值。
			//使用指定的 byte 数组对摘要进行最后更新，然后完成摘要计算;通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后，摘要被重置
			secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException("没有md5这个算法！");
		}

		/*
		 BigInteger(int signum,
                  byte[] magnitude)将 BigInteger 的符号-数量表示形式转换为 BigInteger。该符号表示为一个正负号整数值：-1 表示负，0 表示零，1 表示正。
                  该大小是一个 big-endian 字节顺序的 byte 数组：最高有效字节在第零个元素中。允许零长度数量数组，这会导致 BigInteger 的值为 0，无论其正负号是 -1、0 还是 1。

		参数：
			signum - 该数的正负号（-1 表示负，0 表示零，1 表示正）。
			magnitude - 该数的大小的 big-endian 二进制表示形式。
		 */
		String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字
		// 如果生成数字未满32位，需要前面补0
		for (int i = 0; i < 32 - md5code.length(); i++) {
			md5code = "0" + md5code;
		}
		return md5code;
	}

	public static void main(String[] args) {
		System.out.println(md5("1234"));
	}

}